package com.hanthink.common.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

/**
 * 微信机器人消息发送工具类
 * 提供向企业微信机器人发送文本消息的功能，支持@指定用户或@所有人
 *
 * @author WangBin
 * @since 2025-10-23
 */
@Component
@Slf4j
public class WeChatRobotUtils {

    private final static String MSGTYPE = "markdown";
    private final static String TEXT = "text";


    /**
     * 发送文本消息到微信机器人（通用方法）
     * 支持发送普通消息、@指定用户或@所有人
     *
     * @param robotUrl 企业微信机器人Webhook地址
     * @param msg      要发送的消息内容，不能为空
     * @param user     要@的用户：
     *                 - "@all": @所有人
     *                 - "zhangsan": @指定用户
     *                 - null或空: 不@任何人
     * @throws RuntimeException 当消息发送过程中出现异常时抛出
     * @example // @所有人
     * WeChatRobotUtils.sendTextMessage("url", "紧急通知", "@all");
     * // @指定用户
     * WeChatRobotUtils.sendTextMessage("url", "任务提醒", "zhangsan");
     * // 不@任何人
     * WeChatRobotUtils.sendTextMessage("url", "普通通知", null);
     */
    public static void sendMessage(String robotUrl, String msg, String user) {
        try {
            // 参数校验
            if (StringUtils.isEmpty(msg) || StringUtils.isEmpty(robotUrl)) {
                log.error("微信机器人消息发送失败：消息内容或机器人地址不能为空");
                return;
            }

            // 构建请求JSON
            JSONObject requestJson = buildRequestJson(msg, user);
            String json = requestJson.toJSONString();

            // 发送HTTP请求
            sendHttpRequest(robotUrl, json);

        } catch (Exception e) {
            log.error("微信机器人消息发送异常：{}", e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 构建微信机器人请求JSON对象
     * 根据企业微信机器人消息格式要求构建JSON数据
     *
     * @param msg  消息内容，不能为空
     * @param user 提及用户：
     *             - "@all": 提及所有人
     *             - 其他: 提及指定用户
     *             - null: 不提及任何人
     * @return JSONObject 符合企业微信机器人格式的JSON对象
     * @see <a href="https://developer.work.weixin.qq.com/document/path/91770">企业微信机器人文档</a>
     */
    private static JSONObject buildRequestJson(String msg, String user) {
        // 创建主消息对象
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msgtype", "text");

        // 创建文本内容对象
        JSONObject text = new JSONObject();
        text.put("content", msg);

        // 处理提及列表
        if (StringUtils.isNotEmpty(user)) {
            if ("@all".equals(user)) {
                // 如果是@all，保持原来的处理方式
                text.put("mentioned_list", new String[]{"@all"});
            } else {
                // 如果是用户ID，按逗号分割成数组
                String[] mentionedArray = user.split(",");
                // 可选：去除每个元素的前后空格
                for (int i = 0; i < mentionedArray.length; i++) {
                    mentionedArray[i] = mentionedArray[i].trim();
                }
                text.put("mentioned_list", mentionedArray);
            }
        }
        // 将文本内容添加到主消息对象
        jsonObject.put("text", text);
        return jsonObject;
    }

    /**
     * 发送HTTP POST请求到企业微信机器人
     * 使用HttpURLConnection发送JSON格式的POST请求
     *
     * @param robotUrl 企业微信机器人Webhook地址
     * @param json     要发送的JSON字符串
     * @return boolean 请求是否成功 true-成功 false-失败
     * @throws Exception 网络异常、IO异常等
     */
    private static boolean sendHttpRequest(String robotUrl, String json) {
        HttpURLConnection http = null;
        try {
            // 创建URL连接
            URL postUrl = new URL(robotUrl);
            http = (HttpURLConnection) postUrl.openConnection();

            // 设置请求属性
            http.setRequestMethod("POST");
            http.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            http.setDoOutput(true);
            http.setDoInput(true);
            http.setConnectTimeout(30000);  // 30秒连接超时
            http.setReadTimeout(30000);     // 30秒读取超时

            // 建立连接
            http.connect();

            // 写入请求体数据
            try (OutputStream outputStream = http.getOutputStream()) {
                outputStream.write(json.getBytes(StandardCharsets.UTF_8));
                outputStream.flush();
            }

            // 读取响应数据
            try (InputStream inputStream = http.getInputStream();
                 ByteArrayOutputStream result = new ByteArrayOutputStream()) {

                byte[] buffer = new byte[1024];
                int length;
                while ((length = inputStream.read(buffer)) != -1) {
                    result.write(buffer, 0, length);
                }
                String response = result.toString(StandardCharsets.UTF_8);
                log.info("微信机器人返回结果:{}", response);
            }

            // 判断请求是否成功
            return http.getResponseCode() == 200;

        } catch (Exception e) {
            log.error("微信机器人HTTP请求异常：{}", e.getMessage());
            e.printStackTrace();
            return false;
        } finally {
            // 确保连接被关闭
            if (http != null) {
                http.disconnect();
            }
        }
    }
}